home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1996 September / JCSM Shareware Collection (JCS Distribution) (September 1996).ISO / bother__ / cenvid.zip / CENVIDOS.ZIP / OS2SESSN.CMM < prev    next >
Text File  |  1995-03-31  |  6KB  |  172 lines

  1. // OS2Sessn.cmm - start a session in OS/2 and then return
  2. // ver.2          from DOS or Windows
  3.  
  4. if ( !defined(_DOS_) && !defined(_WINDOWS_) && !defined(_DOS32_) ) {
  5.    printf("\a\n");
  6.    puts("OS2Sessn.cmm starts session from within DOS or Windows")
  7.    puts("running under OS/2, and must be executed from CEnvi for")
  8.    puts("DOS or CEnvi for Windows");
  9.    exit(EXIT_FAILURE);
  10. }
  11.  
  12. Instructions()
  13. {
  14.    printf("\a\n");
  15.    puts(`OS2Sessn - Start an OS/2 session from DOS or Windows under OS/2`)
  16.    puts(``)
  17.    puts(`USAGE: CEnvi OS2Sessn <D|O|P|E|S><W|F><C|I><F|B><E|N> [Commands]`)
  18.    puts(``)
  19.    puts(`WHERE: D,O,P,E,S - DOS, OS/2, PM, Enhance Windows, or Standard Windows`)
  20.    puts(`       W,F - Windowed or Full-Screen`)
  21.    puts(`       C,I - Child or Independent; if child then return when child done`)
  22.    puts(`       F,B - Foreground or Background`)
  23.    puts(`       E,N - Environment inherited or no inherit environment`)
  24.    puts(`       Commands - Any command to pass on. Any two single qotes together ('')`)
  25.    puts(`                  row will be replace by a double quote(")`)
  26.    puts(``)
  27.    puts(`EXAMPLES: CEnvi OS2Sessn DFCFE edit.com c:\autoexec.bat`)
  28.    puts(`          CEnvi OS2Sessn OFIBN CMD.EXE SESSION /W /WIN /F WINFILE.EXE`)
  29.    puts(`          CEnvi OS2Sessn DFIBN COMPILE.EXE FOO.MAK`)
  30.    if ( defined(_WINDOWS_) && !defined(_SHELL_) ) {
  31.       printf("Press any key to exit...");
  32.       getch();
  33.    }
  34.    exit(EXIT_FAILURE);
  35. }
  36.  
  37. main(argc,argv)
  38. {
  39.    if ( argc < 2  ||  5 != strlen(Flags=strupr(argv[1])) ) {
  40.       printf("\nUnknown flags (First parameter).\n");
  41.       Instructions();
  42.    }
  43.    if ( !strchr("DOPES",SessionType=Flags[0]) ) {
  44.       printf("\nUnknown Session Type \"%c\", must be D, O, P, E, or S\n",SessionType);
  45.       Instructions();
  46.    }
  47.    if ( !strchr("WF",SessionSize=Flags[1]) ) {
  48.       printf("\nUnknown Session Size \"%c\", must be W or F\n",SessionSize);
  49.       Instructions();
  50.    }
  51.    if ( !strchr("CI",SessionRelation=Flags[2]) ) {
  52.       printf("\nUnknown Session Relation \"%c\", must be C or I\n",SessionRelation);
  53.       Instructions();
  54.    }
  55.    if ( !strchr("FB",SessionPriority=Flags[3]) ) {
  56.       printf("\nUnknown Session Priority \"%c\", must be F or B\n",SessionPriority);
  57.       Instructions();
  58.    }
  59.    if ( !strchr("EN",SessionEnvironment=Flags[4]) ) {
  60.       printf("\nUnknown Session Environment \"%c\", must be E or N\n",SessionEnvironment);
  61.       Instructions();
  62.    }
  63.  
  64.    BuildCommand(argc-2,argv+2,Title,Program,Parameters);
  65.  
  66.    StartData = BuildStartData(SessionType,SessionSize,SessionRelation,SessionPriority,
  67.                               SessionEnvironment,Title,Program,Parameters);
  68.  
  69.    // call the interrupt to start this block
  70.    reg.ah = 0x64;
  71.    reg.bx = 0x25;    // API ordinal
  72.    reg.ch = 'c', reg.cl = 'l';
  73.    reg.ds = segment(StartData);
  74.    reg.si = offset(StartData);
  75.    interrupt(0x21,reg);
  76. }
  77.  
  78. BuildStartData(Type,Size,Relationship,Priority,Environment,Title,Program,Parameters)
  79. {
  80.    BLObPut(sdata,0,UWORD16);  // size of structure, add later
  81.    BLObPut(sdata,Relationship == 'C' ? 1 : 0,UWORD16);
  82.    BLObPut(sdata,Priority == 'F' ? 0 : 1,UWORD16);
  83.    BLObPut(sdata,0,UWORD16);  // no trace
  84.    BLObPut(sdata,Title ? pointer(Title) : NULL,UWORD32);
  85.    if ( Type == 'E' || Type == 'S' ) {
  86.       // windows program start WIN.COM
  87.       if ( Program ) {
  88.          if ( Parameters )
  89.             sprintf(Parameters,"%s %s",Program,Parameters);
  90.          else
  91.             strcpy(Parameters,Program);
  92.       }
  93.       if ( Type == 'E' ) {
  94.          if ( Parameters )
  95.             sprintf(Parameters,"/3 %s",Parameters);
  96.          else
  97.             Parameters = "/3";
  98.       }
  99.       Program = "WIN.COM";
  100.    }
  101.    BLObPut(sdata,Program ? pointer(Program) : NULL,UWORD32);
  102.    BLObPut(sdata,Parameters ? pointer(Parameters) : NULL,UWORD32);
  103.    BLObPut(sdata,0,UWORD32);  // TERMQ
  104.    BLObPut(sdata,0,UWORD32);  // pointer to environment
  105.    BLObPut(sdata,Environment == 'E' ? 1 : 0,UWORD16);
  106.    // finally, determine program type
  107.    #define SESSION_DEFAULT             0
  108.    #define SESSION_OS2_FULLSCREEN      1
  109.    #define SESSION_WINDOWABLEVIO       2
  110.    #define SESSION_PM                  3
  111.    #define SESSION_DOS_FULLSCREEN      4
  112.    #define SESSION_DOS_WINDOWED        7
  113.    switch( Type ) {
  114.       case 'D':
  115.          SessionType = ( Size == 'F' ? SESSION_DOS_FULLSCREEN : SESSION_DOS_WINDOWED );
  116.          break;
  117.       case 'O':
  118.          SessionType = ( Size == 'F' ? SESSION_OS2_FULLSCREEN : SESSION_WINDOWABLEVIO );
  119.          break;
  120.       case 'P':
  121.          SessionType = 3;
  122.          break;
  123.       case 'E':
  124.       case 'S':
  125.          if ( Size == 'F' ) {
  126.             SessionType = SESSION_DOS_FULLSCREEN;
  127.             break;
  128.          }
  129.          printf("\a\nOS2Sessn does not directly start Windows in Seamless mode.\n")
  130.          printf("You may try starting and OS/2 session with a START or SESSION\n");
  131.          printf("command.\n");
  132.          if ( defined(_WINDOWS_) ) {
  133.             printf("Press any key to exit...");
  134.             getch();
  135.          }
  136.          exit(EXIT_FAILURE);
  137.    }
  138.    BLObPut(sdata,SessionType,UWORD16);
  139.    // go back and add size
  140.    BLObPut(sdata,0,BLObSize(sdata),UWORD16);
  141.    return sdata;
  142. }
  143.  
  144.  
  145. BuildCommand(argc,argv,Title,Program,Parameters)
  146. {
  147.    if ( !argc ) {
  148.       Program = Parameters = Title = NULL;
  149.    } else {
  150.       Program = argv[0];
  151.       // build title as root name of command
  152.       Title = SplitFileName(Program).name;
  153.       if ( argc == 1 )
  154.          Parameters = NULL;
  155.       else {
  156.          Parameters = "";
  157.          for ( i = 1; i < argc; i++ ) {
  158.             strcat(Parameters," ");
  159.             strcat(Parameters,argv[i]);
  160.          }
  161.          Parameters;
  162.          // turn any double single-quotes into a double-quote
  163.          s = Parameters;
  164.          while ( s = strstr(s,"\'\'") ) {
  165.             strcpy(s,s+1);
  166.             s[0] = '\"';
  167.          }
  168.       }
  169.    }
  170. }
  171.  
  172.